package com.molichuxing.services.infrastructure.dao;

import com.molichuxing.framework.dao.RootMapper;
import com.molichuxing.services.infrastructure.bean.OrderScheduleBean;
import com.molichuxing.services.infrastructure.dto.response.OrderScheduleCurrentPeriodDto;
import com.molichuxing.services.infrastructure.dto.response.OrderScheduleOverdueDto;
import com.molichuxing.services.infrastructure.dto.response.OrderScheduleUnpaidDto;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;

public interface OrderScheduleMapper extends RootMapper<OrderScheduleBean> {

    /**
     * 根据订单号和状态获取
     *
     * @param orderCode 订单号
     * @param status    状态
     * @return
     */
    List<OrderScheduleBean> getList(@Param("orderCode") Long orderCode, @Param("status") Integer status);

    /**
     * 根据条件分页查询本期排期count
     *
     * @param params 参数
     * @return
     */
    long getCurrentPeriodPageCount(@Param("params") Map<String, Object> params);

    /**
     * 根据条件分页查询本期排期
     *
     * @param params   参数
     * @param pageNum  页数
     * @param pageSize 每页条数
     * @return
     */
    List<OrderScheduleBean> getCurrentPeriodPage(@Param("params") Map<String, Object> params,
                                                 @Param("pageNum") int pageNum, @Param("pageSize") int pageSize);

    /**
     * 根据条件分页查询逾期未还排期count
     *
     * @param params 参数
     * @return
     */
    long getOverduePageCount(@Param("params") Map<String, Object> params);

    /**
     * 根据条件分页查询逾期未还排期
     *
     * @param params   参数
     * @param pageNum  页数
     * @param pageSize 每页条数
     * @return
     */
    List<OrderScheduleBean> getOverduePage(@Param("params") Map<String, Object> params, @Param("pageNum") int pageNum,
                                           @Param("pageSize") int pageSize);

    /**
     * 根据还款计划id查询还款信息
     *
     * @param ids 还款计划id
     * @return
     */
    List<OrderScheduleBean> getListByIds(@Param("ids") List<Integer> ids);

    /**
     * 批量新增
     *
     * @param beanList OrderScheduleBean集合
     * @return
     */
    int createBatch(@Param("beanList") List<OrderScheduleBean> beanList);

    List<OrderScheduleUnpaidDto> getOrderScheduleUnpaidByDealerId(Integer dealerId);

    List<OrderScheduleBean> getOrderScheduleRelationDto(@Param("orderCode") Long orderCode);

    /**
     * 根据还款计划id查询经销商订单还款信息
     *
     * @param ids 还款计划id
     * @return
     */
    List<OrderScheduleBean> getOrderDealerListByIds(@Param("ids") List<Integer> ids);

    BigDecimal getDownPaymentByOrderCode(Long orderCode);

    BigDecimal getAmountPaidByOrderCode(@Param("orderCode") Long orderCode, @Param("status") Integer status);

    /**
     * 还款成功修改排期信息
     *
     * @param orderSchedule
     * @return
     */
    int modifyOrderScheduleRepayment(OrderScheduleBean orderSchedule);

    /**
     * 修改经销商订单排期应付款日期
     *
     * @param orderSchedule
     * @return
     */
    int modifyDealerOrderSchedulePayableDate(OrderScheduleBean orderSchedule);

    /**
     * 还款计划数量
     *
     * @return
     */
    Integer getOrderScheduleCurrentPeriodCount(@Param("dealerId") Integer dealerId);

    /**
     * 逾期数量
     *
     * @return
     */
    Integer getOrderScheduleOverdueCount(@Param("dealerId") Integer dealerId);

    BigDecimal getDealerFirstPayable(@Param("orderCode") Long orderCode);

    BigDecimal getDealerPayable(@Param("orderCode") Long orderCode);

    /**
     * 查询订单排期信息
     *
     * @param orderCode 订单号
     * @param periods   排期期数
     * @return
     */
    OrderScheduleBean getOrderScheduleByPeriods(@Param("orderCode") Long orderCode,
                                                @Param("periods") Integer periods);

    /**
     * 支付完成修改排期信息
     *
     * @param orderScheduleBean
     * @param value
     * @return
     */
    Integer modifyPay(@Param("bean") OrderScheduleBean orderScheduleBean, @Param("oldStatus") Integer oldStatus);

    Integer getDealerByDealerId(@Param("dealerId") Integer dealerId);

    int modifyStatusByIdAndOrderCode(@Param("id") Integer id, @Param("status") Integer status, @Param("payWay") Integer payWay);

    /**
     * 逾期未还订单数量
     *
     * @return
     */
    Integer getOrderOverdue();

    /**
     * 专属订单未还排期
     *
     * @param payableDate
     * @param isAll
     * @return
     */
    List<OrderScheduleBean> getExclusivelUnpayPeriod(@Param("payableDate") LocalDate payableDate,
                                                     @Param("status") Integer status, @Param("isAll") boolean isAll);

    /**
     * 商家订单未还排期
     *
     * @param payableDate
     * @return
     */
    List<OrderScheduleBean> getDealerUnpayPeriod(@Param("payableDate") LocalDate payableDate,
                                                 @Param("status") Integer status, @Param("isAll") boolean isAll);

    /**
     * 排期修改为已终止
     *
     * @param orderCode 订单号
     * @param status    终止状态
     * @return
     */
    Integer modifyCancel(@Param("orderCode") Long orderCode, @Param("status") Integer status,
                         @Param("preStatus") Integer preStatus);

    /**
     * 查询专属里程本期还款计划导出数据
     *
     * @param selectParams
     * @return
     */
    List<OrderScheduleCurrentPeriodDto> getExclusivelOrderCurrentPeriodDownload(
            @Param("params") Map<String, Object> selectParams);

    /**
     * 查询专属里程本期还款计划导出数据条数
     *
     * @param selectParams
     * @return
     */
    Long getExclusivelOrderCurrentPeriodDownloadCount(@Param("params") Map<String, Object> selectParams);

    /**
     * 查询专属里程逾期数据导出数据
     *
     * @param selectParams
     * @return
     */
    List<OrderScheduleOverdueDto> getExclusivelOrderOverdueDownload(@Param("params") Map<String, Object> selectParams);

    /**
     * 查询专属里程逾期数据导出数据条数
     *
     * @param selectParams
     * @return
     */
    Long getExclusivelOrderOverdueDownloadCount(@Param("params") Map<String, Object> selectParams);

    /**
     * 查询应还日期小于查询日期的有效排期信息(未还、已还)
     *
     * @param userId
     * @param payableDate
     * @param statusList
     * @return
     */
    List<OrderScheduleBean> getOrderScheduleLtDate(@Param("userId") Integer userId,
                                                   @Param("payableDate") LocalDate payableDate, @Param("statusList") List<Integer> statusList);

    /**
     * 逾期未还订单
     *
     * @param orderCode
     * @param status
     * @return
     */
    Integer getOverdueCount(@Param("orderCode") Long orderCode, @Param("status") int status);
}